package com.cax.module.file.service;

import com.cax.module.file.domain.File;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cax.module.file.domain.vo.File2VO;
import com.cax.module.file.domain.vo.FileVO;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * 文件表 Service接口
 * @author liangjian
 * @date 2023-11-24 16:52:24
 */
public interface FileService extends IService<File> {
	/**测试*/
	void test();
	/**上传 测试*/
	FileVO uploadTest(MultipartFile file) throws IOException;
	/**下载 测试*/
	void downLoadTest(HttpServletResponse response,String fileName) throws IOException;

	/**
	 * MultipartFile 文件上传
	 * @param fileTypeId 文件类型id 来源file_type.id
	 * @param file MultipartFile
	 * @return File2VO
	 */
	File2VO upload(Integer fileTypeId, MultipartFile file);

	/**
	 * java.io.File 文件上传
	 * @param fileTypeId 文件类型id 来源file_type.id
	 * @param file java.io.File
	 * @return File2VO
	 */
	File2VO upload(Integer fileTypeId, java.io.File file);

	/**
	 * 生成网络可访问的url
	 * @param fileId 我们业务系统文件id
	 * @return String 文件网络可访问的url
	 */
	String createUrl(Long fileId);

	/**
	 * 生成网络可访问的url
	 * @param file 我们业务系统文件File对象
	 * @return String 文件网络可访问的url
	 */
	String createUrl(File file);

	/**
	 * 文件查询
	 * @param fileTypeId 文件类型id 来源file_type.id
	 * @param relevanceId 文件关联的业务id 例如工单id 用户id
	 * @return List<File2VO>
	 */
	<T> List<File2VO> get(Integer fileTypeId,T relevanceId);

	/**
	 * 文件查询
	 * @param fileTypeId 文件类型id 来源file_type.id
	 * @param relevanceIds 文件关联的业务id数组 例如工单id [1L,2L,3L]
	 * @return Map<T,List<File2VO>> key为业务id value为文件数据
	 */
	<T> Map<T,List<File2VO>> getMap(Integer fileTypeId,List<T> relevanceIds);

	/**
	 * 文件查询
	 * @param fileTypeIds 文件类型id 来源file_type.id
	 * @param relevanceIds 文件关联的业务id数组 例如工单id [1L,2L,3L]
	 *@return Map<String,List<File2VO>> key为文件类型id 加上 - 在加上 文件业务id 例如110000-1
	 */
	Map<String,List<File2VO>> getMap(List<Integer> fileTypeIds,List<Object> relevanceIds);

	/**
	 * 新增文件保存
	 * @param relevanceId 文件关联的业务id 例如工单id 用户id等
	 * @param fileIds 文件id
	 */
	<T> void addSave(T relevanceId,List<Long> fileIds);

	/**
	 * 修改文件保存
	 * @param fileTypeId 文件类型id 来源file_type.id
	 * @param relevanceId 文件关联的业务id 例如工单id 用户id等
	 * @param fileIds 文件id
	 */
	<T> void updSave(Integer fileTypeId,T relevanceId,List<Long> fileIds);

	/**
	 * 文件实体File转File2VO
	 * @param files 文件数组
	 * @return List<File2VO>
	 */
	List<File2VO> fileToFile2VO(List<File> files);

	/**
	 * 删除无效文件
	 */
	void del();

	/**
	 * 文件逻辑删除
	 * @param fileIds 文件id数组
	 */
	void del(List<Long> fileIds);

	/**
	 * 文件复制
	 * @param fileIds 需要复制的文件id集
	 * @return Map<Long,File2VO> 返回map key为原文件id val为原文件对应的复制文件
	 */
	Map<Long,File2VO> copy(List<Long> fileIds);
	/**
	 * 文件复制
	 * @param fileIds 需要复制的文件id集
	 * @return MList<File2VO>
	 */
	List<File2VO> copy2(List<Long> fileIds);

	/**
	 * 下载文件
	 * @param fileTypeId  业务类型id
	 * @param filePath 文件全路径
	 * @param fileName  下载后的文件名称
	 * @param response
	 */
	void fileDownload(
		Integer fileTypeId,
		String filePath,
		String fileName,
		HttpServletResponse response
	);

	/**
	 * 下载
	 * @param response
	 * @param fileId 文件id
	 * @param fileName 指定下载后的文件名称（不包含后缀 后缀根据文件上传的后缀） 如果不指定 使用文件上传时的名称
	 */
	void fileDownload(
			HttpServletResponse response,
			Long fileId,
			String fileName
	);
}

